/*********************************************************************
 * Copyright (C) 2005 Andrew Khan
 * <p>
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * <p>
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * <p>
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 ***************************************************************************/

package jxl.biff;

import jxl.common.Logger;

/**
 * Enumeration type for the excel country codes
 */
public class CountryCode {
    /**
     * The logger
     */
    private static Logger logger = Logger.getLogger(CountryCode.class);

    /**
     * The country code
     */
    private int value;

    /**
     * The ISO 3166 two letter country mnemonic (as used by the Locale class)
     */
    private String code;

    /**
     * The long description
     */
    private String description;

    /**
     * The array of country codes
     */
    private static CountryCode[] codes = new CountryCode[0];

    /**
     * Constructor
     */
    private CountryCode(int v, String c, String d) {
        value = v;
        code = c;
        description = d;

        CountryCode[] newcodes = new CountryCode[codes.length + 1];
        System.arraycopy(codes, 0, newcodes, 0, codes.length);
        newcodes[codes.length] = this;
        codes = newcodes;
    }

    /**
     * Constructor used to create an arbitrary code with a specified value.
     * Doesn't add the latest value to the static array
     */
    private CountryCode(int v) {
        value = v;
        description = "Arbitrary";
        code = "??";
    }

    /**
     * Accessor for the excel value
     *
     * @return the excel value
     */
    public int getValue() {
        return value;
    }

    /**
     * Accessor for the string
     *
     * @return the two character iso 3166 string
     */
    public String getCode() {
        return code;
    }

    /**
     * Gets the country code for the given two character mnemonic string
     */
    public static CountryCode getCountryCode(String s) {
        if (s == null || s.length() != 2) {
            logger.warn("Please specify two character ISO 3166 country code");
            return USA;
        }

        CountryCode code = UNKNOWN;
        for (int i = 0; i < codes.length && code == UNKNOWN; i++) {
            if (codes[i].code.equals(s)) {
                code = codes[i];
            }
        }

        return code;
    }

    /**
     * Creates an arbitrary country code with the specified value.  Used
     * when copying sheets, and the country code isn't initialized as part
     * of the static data below
     */
    public static CountryCode createArbitraryCode(int i) {
        return new CountryCode(i);
    }

    // The country codes
    public final static CountryCode USA = new CountryCode(0x1, "US", "USA");
    public final static CountryCode CANADA =
            new CountryCode(0x2, "CA", "Canada");
    public final static CountryCode GREECE =
            new CountryCode(0x1e, "GR", "Greece");
    public final static CountryCode NETHERLANDS =
            new CountryCode(0x1f, "NE", "Netherlands");
    public final static CountryCode BELGIUM =
            new CountryCode(0x20, "BE", "Belgium");
    public final static CountryCode FRANCE =
            new CountryCode(0x21, "FR", "France");
    public final static CountryCode SPAIN = new CountryCode(0x22, "ES", "Spain");
    public final static CountryCode ITALY = new CountryCode(0x27, "IT", "Italy");
    public final static CountryCode SWITZERLAND =
            new CountryCode(0x29, "CH", "Switzerland");
    public final static CountryCode UK =
            new CountryCode(0x2c, "UK", "United Kingdowm");
    public final static CountryCode DENMARK =
            new CountryCode(0x2d, "DK", "Denmark");
    public final static CountryCode SWEDEN =
            new CountryCode(0x2e, "SE", "Sweden");
    public final static CountryCode NORWAY =
            new CountryCode(0x2f, "NO", "Norway");
    public final static CountryCode GERMANY =
            new CountryCode(0x31, "DE", "Germany");
    public final static CountryCode PHILIPPINES =
            new CountryCode(0x3f, "PH", "Philippines");
    public final static CountryCode CHINA =
            new CountryCode(0x56, "CN", "China");
    public final static CountryCode INDIA =
            new CountryCode(0x5b, "IN", "India");
    public final static CountryCode UNKNOWN =
            new CountryCode(0xffff, "??", "Unknown");
}
